2025.6.4 情報落ち
2つの浮動小数点数の演算を考える。
演算対象が非常に大きな値と小さな値である場合に小さな値の結果が影響を与えなくなることを情報落ちという。
code:p1.py
x = 100000.
y = 1.
for i in range(20):
z = x + y
print(str(i) + ') {:.16f} {:.16f}'.format(z, y))
y = y / 10
結果:
code:result.txt
0) 100001.000000000000000000000000000000 1.000000000000000000000000000000
1) 100000.100000000005820766091346740723 0.100000000000000005551115123126
2) 100000.009999999994761310517787933350 0.010000000000000000208166817117
3) 100000.001000000003841705620288848877 0.001000000000000000020816681712
4) 100000.000100000004749745130538940430 0.000100000000000000004792173602
5) 100000.000010000003385357558727264404 0.000010000000000000000818030539
6) 100000.000000999993062578141689300537 0.000001000000000000000166506349
7) 100000.000000100000761449337005615234 0.000000100000000000000021944591
8) 100000.000000009997165761888027191162 0.000000010000000000000001863587
9) 100000.000000001004082150757312774658 0.000000001000000000000000269077
10) 100000.000000000101863406598567962646 0.000000000100000000000000029493
11) 100000.000000000014551915228366851807 0.000000000010000000000000002626
12) 100000.000000000000000000000000000000 0.000000000001000000000000000182
13) 100000.000000000000000000000000000000 0.000000000000100000000000000016
14) 100000.000000000000000000000000000000 0.000000000000010000000000000002
15) 100000.000000000000000000000000000000 0.000000000000001000000000000000
16) 100000.000000000000000000000000000000 0.000000000000000100000000000000
17) 100000.000000000000000000000000000000 0.000000000000000010000000000000
18) 100000.000000000000000000000000000000 0.000000000000000001000000000000
この場合は12)以降yの値が加算されていないことがわかる。
xの初期値をより大きくした場合などについて試してみよう。